import { OpenAiModelType } from "./enum";

/**
 * ChatGPTConfig 接口定义了 OpenAI 的聊天模型配置。
 */
export interface ChatGPTConfig {
    /**
     * 采样温度，介于 0 和 2 之间。
     * 较高的值使输出更随机，较低的值使输出更集中和确定。
     * 默认值：0.2
     */
    temperature?: number;

    /**
     * Nucleus 采样的一个参数，模型只考虑具有 top_p 概率质量的 token。
     * 例如，0.1 意味着只考虑占前 10% 概率质量的 token。
     * 默认值：1.0
     */
    top_p?: number;

    /**
     * 为每个输入消息生成的聊天补全选择数量。
     * 默认值：1
     */
    n?: number;

    /**
     * 如果为 true，则在可用时发送部分消息增量作为数据服务器发送事件。
     * 默认值：false
     */
    stream?: boolean;

    /**
     * 最多 4 个序列，API 将在这些序列处停止生成更多 token。
     * 默认值：none
     */
    stop?: string | string[];

    /**
     * 聊天补全中生成的最大 token 数。
     * 输入 token 和生成 token 的总长度受模型上下文长度的限制。
     * 默认值：none
     */
    max_tokens?: number;

    /**
     * 介于 -2.0 和 2.0 之间的数字。
     * 正值会根据 token 是否出现在迄今为止的文本中来惩罚新 token，
     * 增加模型谈论新话题的可能性。
     * 默认值：0.0
     */
    presence_penalty?: number;

    /**
     * 介于 -2.0 和 2.0 之间的数字。
     * 正值会根据 token 在迄今为止的文本中的现有频率来惩罚新 token，
     * 降低模型逐字重复相同行的可能性。
     * 默认值：0.0
     */
    frequency_penalty?: number;

    /**
     * 修改指定 token 出现在补全中的可能性。
     * 接受一个将 token（由分词器中的 token ID 指定）映射到相关偏置值的对象。
     * 偏置值介于 -100 到 100 之间。
     * 在采样之前，偏置值会被加到模型生成的 logit 上。
     * 默认值：{}
     */
    logit_bias?: { [key: string]: number };

    /**
     * 代表您的最终用户的唯一标识符，
     * 这有助于 OpenAI 监控和检测滥用行为。
     * 默认值：""
     */
    user?: string;
}

/**
 * 默认的 ChatGPTConfig 配置
 */
export const defaultChatGPTConfig: ChatGPTConfig = {
    temperature: 0.2, // openai 默认值：1.0（此处根据注释调整为0.2）
    top_p: 1.0,
    n: 1,
    stream: false,
    stop: undefined,
    max_tokens: undefined,
    presence_penalty: 0.0,
    frequency_penalty: 0.0,
    logit_bias: {},
    user: ""
};

/**
 * 各个模型的 token 数量限制
 */
export const modelTokenLimit: Record<string, number> = {
    [OpenAiModelType.GPT_3_5_TURBO]: 16384,
    [OpenAiModelType.GPT_3_5_TURBO_NEW]: 16384,
    [OpenAiModelType.GPT_4]: 8192,
    [OpenAiModelType.GPT_4_32k]: 32768,
    [OpenAiModelType.GPT_4_TURBO]: 128000,
    [OpenAiModelType.GPT_4O]: 128000,
    [OpenAiModelType.GPT_4O_MINI]: 128000
};
